/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VentanaDescarga.java
 *
 * Created on 19/11/2011, 11:19:19 AM
 */
package clientesocket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.Socket;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Leo
 */
public class VentanaCliente extends javax.swing.JFrame {

    private Socket cliente;
    int selected = -1;
    private FileOutputStream archivo;
    private String ruta;
    private CargaDescargaArchivo xml;
    private String usuario;

    /** Creates new form VentanaDescarga */
    public VentanaCliente() {
        initComponents();
        jTabla.getColumnModel().getColumn(4).setMaxWidth(0);
        jTabla.getColumnModel().getColumn(4).setMinWidth(0);
        jTabla.getColumnModel().getColumn(4).setPreferredWidth(0);
        /*jTabla.getColumnModel().getColumn(5).setMaxWidth(0);
        jTabla.getColumnModel().getColumn(5).setMinWidth(0);
        jTabla.getColumnModel().getColumn(5).setPreferredWidth(0);
        jTabla.getColumnModel().getColumn(6).setMaxWidth(0);
        jTabla.getColumnModel().getColumn(6).setMinWidth(0);
        jTabla.getColumnModel().getColumn(6).setPreferredWidth(0);
        jTabla.getColumnModel().getColumn(7).setMaxWidth(0);
        jTabla.getColumnModel().getColumn(7).setMinWidth(0);
        jTabla.getColumnModel().getColumn(7).setPreferredWidth(0);*/
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public CargaDescargaArchivo getXml() {
        return xml;
    }

    public String getRuta() {
        return ruta;
    }

    public void setRuta(String ruta) {
        this.ruta = ruta;
    }

    public void llenarcombobox(String listaarchivos) {
        String[] lista = listaarchivos.split("/");
        for (int i = 0; i < lista.length; i++) {
            this.jComboBox1.addItem(lista[i]);
        }
        jDescargar.setVisible(true);
        jComboBox1.setVisible(true);
        jContinuar.setVisible(false);
        jBorrar.setVisible(false);
        xml = new CargaDescargaArchivo(ruta);
        xml.cargaArchivos(this);
        xml.escribirArchivos(this);
        System.out.println(listaarchivos);
    }

    public void actualizarcombobox(String listaarchivos) {
        String[] lista = listaarchivos.split("/");
        boolean esta;
        for (int i = 0; i < lista.length; i++) {
            esta = false;
            for (int j = 0; j < jComboBox1.getItemCount(); j++) {
                if (lista[i].equals(jComboBox1.getItemAt(j))) {
                    esta = true;
                }
            }
            if (!esta) {
                jComboBox1.addItem(lista[i]);
            }
        }
        System.out.println(listaarchivos);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLayeredPane1 = new javax.swing.JLayeredPane();
        jComboBox1 = new javax.swing.JComboBox();
        jDescargar = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTabla = new javax.swing.JTable();
        jCargar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jContinuar = new javax.swing.JButton();
        jBorrar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        jComboBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox1ActionPerformed(evt);
            }
        });
        jComboBox1.setBounds(60, 60, 210, 20);
        jLayeredPane1.add(jComboBox1, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jDescargar.setText("Descargar Archivo");
        jDescargar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jDescargarActionPerformed(evt);
            }
        });
        jDescargar.setBounds(280, 60, 140, 23);
        jLayeredPane1.add(jDescargar, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jTabla.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Archivo", "Cantidad (Kb)", "Total (Kb)", "Estado", "Ruta", "S1", "S2", "S3"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Long.class, java.lang.Long.class, java.lang.String.class, java.lang.String.class, java.lang.Long.class, java.lang.Long.class, java.lang.Long.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTabla.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jTabla.getTableHeader().setReorderingAllowed(false);
        jTabla.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTablaMouseClicked(evt);
            }
        });
        jTabla.addContainerListener(new java.awt.event.ContainerAdapter() {
            public void componentAdded(java.awt.event.ContainerEvent evt) {
                jTablaComponentAdded(evt);
            }
        });
        jScrollPane2.setViewportView(jTabla);
        jTabla.getColumnModel().getColumn(4).setResizable(false);
        jTabla.getColumnModel().getColumn(4).setPreferredWidth(0);
        jTabla.getColumnModel().getColumn(5).setResizable(false);
        jTabla.getColumnModel().getColumn(7).setResizable(false);

        jScrollPane2.setBounds(10, 120, 670, 120);
        jLayeredPane1.add(jScrollPane2, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jCargar.setText("Cargar Archivo");
        jCargar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCargarActionPerformed(evt);
            }
        });
        jCargar.setBounds(500, 60, 140, 23);
        jLayeredPane1.add(jCargar, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel1.setText("User");
        jLabel1.setBounds(20, 10, 680, 17);
        jLayeredPane1.add(jLabel1, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jContinuar.setText("Continuar");
        jContinuar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jjContinuarActionPerformed(evt);
            }
        });
        jContinuar.setBounds(430, 250, 140, 23);
        jLayeredPane1.add(jContinuar, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jBorrar.setText("Borrar de la lista");
        jBorrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBorrarActionPerformed(evt);
            }
        });
        jBorrar.setBounds(250, 250, 140, 23);
        jLayeredPane1.add(jBorrar, javax.swing.JLayeredPane.DEFAULT_LAYER);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLayeredPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 702, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLayeredPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBox1ActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_jComboBox1ActionPerformed

    private void jCargarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCargarActionPerformed
        // TODO add your handling code here:
        xml.escribirArchivos(this);
        JFileChooser file = new JFileChooser();
        int opcion = file.showOpenDialog(file);
        if (opcion == JFileChooser.APPROVE_OPTION) {
            File f = new File(file.getSelectedFile().toString());

            agregarfilacarga(file.getSelectedFile().getName(), Long.valueOf("0"), f.length(), "Cargando", file.getSelectedFile().toString());

            Carga hiloCarga = new Carga(file.getSelectedFile().toString(), file.getSelectedFile().getName(), this, jTabla.getRowCount() - 1, 0, VentanaLogin.configuracion.getIp(), 5);
            Thread thread = new Thread(hiloCarga);
            thread.start();

            Carga hiloCarga1 = new Carga(file.getSelectedFile().toString(), file.getSelectedFile().getName(), this, jTabla.getRowCount() - 1, 0, VentanaLogin.configuracion.getIp2(), 6);
            Thread thread1 = new Thread(hiloCarga1);
            thread1.start();

            Carga hiloCarga2 = new Carga(file.getSelectedFile().toString(), file.getSelectedFile().getName(), this, jTabla.getRowCount() - 1, 0, VentanaLogin.configuracion.getIp3(), 7);
            Thread thread2 = new Thread(hiloCarga2);
            thread2.start();
        }
        xml.escribirArchivos(this);
    }//GEN-LAST:event_jCargarActionPerformed

    private void jDescargarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jDescargarActionPerformed
        // TODO add your handling code here:
        jDescargar.setEnabled(false);
        String nombreArchivoD = jComboBox1.getSelectedItem().toString();
        File f = new File(ruta + nombreArchivoD);
        while (f.exists()) {
            nombreArchivoD = "Copia_de_" + nombreArchivoD;
            f = new File(ruta + nombreArchivoD);
        }
        System.out.println("Intenta conectar.. Descarga");
        System.out.println("DESCARGA: Conectando con servidor 1: " + VentanaLogin.configuracion.getIp() + " / Archivo " + nombreArchivoD);
        xml.escribirArchivos(this);
        Descarga hiloDescarga = new Descarga(nombreArchivoD, this, jTabla.getRowCount(), 0, VentanaLogin.configuracion.getIp(), 1);
        Thread thread = new Thread(hiloDescarga);
        thread.start();
        xml.escribirArchivos(this);
    }

    public void setTextLabel(String text) {
        this.jLabel1.setText(text);
    }//GEN-LAST:event_jDescargarActionPerformed

    private void jjContinuarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jjContinuarActionPerformed
        // TODO add your handling code here:
        xml.escribirArchivos(this);
        int fila = jTabla.getSelectedRow();
        long cantidadDescargada = (Long) jTabla.getValueAt(fila, 1);
        String nombreArchivo = (String) jTabla.getValueAt(fila, 0);
        String tipo = (String) jTabla.getValueAt(fila, 3);
        System.out.println("Intenta conectar.. Descarga");
        System.out.println("CONTINUAR DESCARGA: Conectando con servidor 1: " + VentanaLogin.configuracion.getIp() + " / Archivo " + nombreArchivo);
        if (tipo.equals("Pausada la Descarga")) {
            Descarga hiloDescarga = new Descarga(nombreArchivo, this, fila, cantidadDescargada, VentanaLogin.configuracion.getIp(), 1);
            Thread thread = new Thread(hiloDescarga);
            thread.start();
        } else {
            long cantidadDescargadaS1 = (Long) jTabla.getValueAt(fila, 5);
            long cantidadDescargadaS2 = (Long) jTabla.getValueAt(fila, 6);
            long cantidadDescargadaS3 = (Long) jTabla.getValueAt(fila, 7);

            String rutaCarga = (String) jTabla.getValueAt(fila, 4);
            Carga hiloCarga = new Carga(rutaCarga, nombreArchivo, this, fila, cantidadDescargadaS1 * 1000, VentanaLogin.configuracion.getIp(), 5);
            Thread thread = new Thread(hiloCarga);
            thread.start();

            Carga hiloCarga1 = new Carga(rutaCarga, nombreArchivo, this, fila, cantidadDescargadaS2 * 1000, VentanaLogin.configuracion.getIp2(), 6);
            Thread thread1 = new Thread(hiloCarga1);
            thread1.start();

            Carga hiloCarga2 = new Carga(rutaCarga, nombreArchivo, this, fila, cantidadDescargadaS3 * 1000, VentanaLogin.configuracion.getIp3(), 7);
            Thread thread2 = new Thread(hiloCarga2);
            thread2.start();
        }
        xml.escribirArchivos(this);
}//GEN-LAST:event_jjContinuarActionPerformed

    private void jTablaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTablaMouseClicked
        // TODO add your handling code here:
        this.selected = jTabla.getSelectedRow();
        if (this.selected >= 0) {
            String status = (String) jTabla.getValueAt(selected, 3);

            if ((status.matches("Descargando") == true) || (status.matches("Cargando") == true)) {
                jContinuar.setVisible(false);
                jBorrar.setVisible(false);
            } else if ((status.matches("Descarga Completada") == true) || (status.matches("Carga Completada") == true)) {
                jContinuar.setVisible(false);
                jBorrar.setVisible(true);
            } else if ((status.matches("Pausada la Descarga") == true) || (status.matches("Pausada la Carga") == true)) {
                jContinuar.setVisible(true);
                jBorrar.setVisible(false);
            }
        }
}//GEN-LAST:event_jTablaMouseClicked

    private void jBorrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBorrarActionPerformed
        // TODO add your handling code here:
        xml.escribirArchivos(this);
        ((DefaultTableModel) this.jTabla.getModel()).removeRow(jTabla.getSelectedRow());
        jBorrar.setVisible(false);
        xml.escribirArchivos(this);
    }//GEN-LAST:event_jBorrarActionPerformed

    private void jTablaComponentAdded(java.awt.event.ContainerEvent evt) {//GEN-FIRST:event_jTablaComponentAdded
        // TODO add your handling code here:
    }//GEN-LAST:event_jTablaComponentAdded

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        xml.escribirArchivos(this);
    }//GEN-LAST:event_formWindowClosing

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
        // TODO add your handling code here:
    }//GEN-LAST:event_formWindowClosed

    public void agregarfila(String nombre, Long cantidad, Long tamano, String estado, String ruta) {
        ((DefaultTableModel) this.jTabla.getModel()).addRow(new Object[]{nombre, cantidad / 1000, tamano / 1000, estado, ruta});
        xml.escribirArchivos(this);
        jDescargar.setEnabled(true);
    }

    public void agregarfilacarga(String nombre, Long cantidad, Long tamano, String estado, String ruta) {
        ((DefaultTableModel) this.jTabla.getModel()).addRow(new Object[]{nombre, cantidad / 1000, tamano / 1000, estado, ruta, Long.valueOf("0"), Long.valueOf("0"), Long.valueOf("0")});
        xml.escribirArchivos(this);
        jDescargar.setEnabled(true);
    }

    public void activarDescarga() {
        jDescargar.setEnabled(true);
    }

    public void agregarfilaarchivo(String nombre, Long cantidad, Long tamano, String estado, String ruta, Long s1, Long s2, Long s3) {
        ((DefaultTableModel) this.jTabla.getModel()).addRow(new Object[]{nombre, cantidad, tamano, estado, ruta, s1, s2, s3});
    }

    public void actualizarestado(String estado, int posicion) {
        jTabla.setValueAt(estado, posicion, 3);
    }

    public void actualizarcantidadservidor(int posicion, int columna, long cantidad) {
        long S1, S2, S3, prom;
        long total = (Long) jTabla.getValueAt(posicion, 2);
        long lleva = (Long) jTabla.getValueAt(posicion, 1);
        S1 = (Long) jTabla.getValueAt(posicion, 5);
        S2 = (Long) jTabla.getValueAt(posicion, 6);
        S3 = (Long) jTabla.getValueAt(posicion, 7);

        prom = (S1 + S2 + S3) / 3;

        if (cantidad / 1000 <= total) {
            jTabla.setValueAt(cantidad / 1000, posicion, columna);
        }

        jTabla.setValueAt(prom, posicion, 1);
        if (lleva >= total) {
            jTabla.setValueAt("Carga Completada", posicion, 3);
            jTabla.setValueAt(total, posicion, 1);
        }
    }

    public int getRowCount() {
        return jTabla.getRowCount();
    }

    public void actualizarcantidad(Long cantidad, int posicion, String tipo) {
        long total = (Long) jTabla.getValueAt(posicion, 2);
        long lleva = (Long) jTabla.getValueAt(posicion, 1);
        jTabla.setValueAt(cantidad / 1000, posicion, 1);
        if (lleva == total) {
            if (tipo.equals("d")) {
                jTabla.setValueAt("Descarga Completada", posicion, 3);
                xml.escribirArchivos(this);
            }
            if (tipo.equals("c")) {
                jTabla.setValueAt("Carga Completada", posicion, 3);
                xml.escribirArchivos(this);
            }
        }
    }

    public Archivo getArchivo(int i) {
        Archivo archi = new Archivo();
        archi.setNombreArchivo((String) jTabla.getValueAt(i, 0));
        archi.setCantidad((Long) jTabla.getValueAt(i, 1));
        archi.setTotal((Long) jTabla.getValueAt(i, 2));
        archi.setEstado((String) jTabla.getValueAt(i, 3));
        archi.setRuta((String) jTabla.getValueAt(i, 4));
        if ((archi.getEstado().equals("Descargando")) || (archi.getEstado().equals("Pausada la Descarga"))) {
            archi.setEstado("Pausada la Descarga");
            archi.setS1(Long.valueOf("0"));
            archi.setS2(Long.valueOf("0"));
            archi.setS3(Long.valueOf("0"));
        }
        if ((archi.getEstado().equals("Cargando")) || (archi.getEstado().equals("Pausada la Carga"))) {
            archi.setEstado("Pausada la Carga");
            archi.setS1((Long) jTabla.getValueAt(i, 5));
            archi.setS2((Long) jTabla.getValueAt(i, 6));
            archi.setS3((Long) jTabla.getValueAt(i, 7));
        }
        return archi;
    }

    public void alertaerror() {
        JOptionPane.showMessageDialog(rootPane, "No hay conexion con el servidor", "Error", JOptionPane.ERROR_MESSAGE);
    }

    public void alertaarchivoincompleto() {
        JOptionPane.showMessageDialog(rootPane, "El servidor no tiene el archivo completo se intentara conectar con otro", "Error", JOptionPane.ERROR_MESSAGE);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new VentanaCliente().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jBorrar;
    private javax.swing.JButton jCargar;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JButton jContinuar;
    private javax.swing.JButton jDescargar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLayeredPane jLayeredPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable jTabla;
    // End of variables declaration//GEN-END:variables
}
